package org.springframework.security.authorization;

import org.springframework.lang.Nullable;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.core.Authentication;

import java.util.function.Supplier;

/**
 * @author Dillon
 * @date 2024/6/28
 * @slogan 致敬大师 致敬未来的你
 * @desc 授权管理器接口，用于标记资源是否允许访问
 */
@FunctionalInterface
public interface AuthorizationManager<T> {

	/**
	 * 默认方法，校验是否登录 登录后才允许访问资源
	 *
	 * @param authentication 认证实现类
	 * @param object         访问资源
	 */
	default void verify(Supplier<Authentication> authentication, T object) {
		AuthorizationDecision decision = check(authentication, object);
		if (decision != null && !decision.isGranted()) {
			throw new AccessDeniedException("Access Denied");
		}
	}

	/**
	 * 通过认证对象校验，判断是否对某一个资源持有访问权限
	 *
	 * @param authentication 认证实现类
	 * @param object         访问资源
	 * @return 是否存在资源权限
	 */
	@Nullable
	AuthorizationDecision check(Supplier<Authentication> authentication, T object);

}
